#!/bin/bash

# 脚本名称：auto_commit.sh
# 功能：自动提交和推送 Git 仓库中的更改
# 适用场景：定期自动提交 Git 仓库，避免手动操作

set -e  # 遇到错误时退出脚本

# 获取脚本所在目录并切换到该目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# 加载本地 Git 配置
CONFIG_FILE="$SCRIPT_DIR/git_config.conf"

if [ -f "$CONFIG_FILE" ]; then
    source "$CONFIG_FILE"
else
    echo "[WARNING] 未找到配置文件 $CONFIG_FILE，跳过 Git 配置检查。"
fi

# 检查全局 Git 用户配置
GLOBAL_USER_NAME=$(git config --global user.name || echo "")
GLOBAL_USER_EMAIL=$(git config --global user.email || echo "")

if [ -z "$GLOBAL_USER_NAME" ] || [ -z "$GLOBAL_USER_EMAIL" ]; then
    if [ -n "$USER_NAME" ] && [ -n "$USER_EMAIL" ]; then
        echo "[INFO] 配置本地 Git 用户信息..."
        git config user.name "$USER_NAME"
        git config user.email "$USER_EMAIL"
    else
        echo "[ERROR] Git 用户信息未设置，且未在配置文件中找到。请手动配置。"
        exit 1
    fi
fi

# 获取当前时间戳
TIMESTAMP=$(date "+%Y-%m-%d-%H_%M_%S")

# 检查是否有未提交的更改（包括未追踪文件）
if git diff --quiet && git diff --cached --quiet && [ -z "$(git ls-files --others --exclude-standard)" ]; then
    echo "[INFO] 没有检测到更改，跳过提交。"
    exit 0
fi

# 仅当有实际更改时才执行 git stash
if ! git diff --quiet || ! git diff --cached --quiet; then
    echo "[INFO] 暂存所有未提交的更改到 stash..."
    git stash push -m "Auto stash before pull"
    STASHED=true
else
    STASHED=false
fi

# 拉取最新代码并合并更改
echo "[INFO] 拉取远程最新代码..."
if ! git pull --rebase origin master; then
    echo "[ERROR] 拉取失败，可能存在合并冲突，请手动解决。"
    exit 1
fi

# 如果之前执行了 git stash，则尝试恢复
if [ "$STASHED" = true ]; then
    echo "[INFO] 恢复之前的更改..."
    if ! git stash pop; then
        echo "[WARNING] 可能存在冲突，请手动检查并解决。"
        exit 1
    fi
fi

# 添加所有新文件和修改
echo "[INFO] 添加所有更改到暂存区..."
git add .

# 确保有实际变更后才提交
if git diff --cached --quiet; then
    echo "[INFO] 没有新的更改需要提交，跳过 commit。"
    exit 0
fi

# 进行 Git 自动提交
echo "[INFO] 提交更改: auto commit at $TIMESTAMP"
git commit -m "auto commit at $TIMESTAMP"

# 推送到远程 master 分支
echo "[INFO] 推送到远程仓库..."
git push origin master

echo "[INFO] 操作完成！"

